/**
 * 发布订阅，EventPS（event publish subscribe）
 */
class EventPS {
  constructor() {
    /**
     * 事件仓库
     * 数据结构例子：
     * eventStore: {
     *   eventA: {
     *     subscriberA: function() {},
     *     subscriberB: function() {},
     *   },
     *   eventB: {
     *     subscriberA: function() {},
     *     subscriberB: function() {},
     *   }
     * }
     */
    this.eventStore = {}
  }

  /**
   * 订阅
   * @param {String} eventName 事件名
   * @param {String} subscriber 订阅者
   * @param {Function} callback 回调函数
   */
  subscribe(eventName, subscriber, callback) {
    // 1.初始化事件
    if (!this.eventStore[eventName]) {
      this.eventStore[eventName] = {}
    }
    // 2.使用订阅者存储回调函数
    this.eventStore[eventName][subscriber] = callback
  }

  publish(eventName, ...args) {
    // 1.取出该事件的所有订阅者
    const subscribers = this.eventStore[eventName]
    // 2.发布消息给订阅者
    for (const subscriber in subscribers) {
      subscribers[subscriber](...args)
    }
  }

  unsubscribe(eventName, subscriber) {
    // 删除对应的订阅者
    delete this.eventStore[eventName][subscriber]
  }

  // 清除所有事件
  clearAll() {
    this.eventStore = {}
  }
}

// 单例模式
const SingleEventPS = (function () {
  let instance = null
  return function () {
    if (instance === null) {
      instance = new EventPS()
    }
    return instance
  }
})()

export default SingleEventPS
